#ifndef EXTERN_H
#define EXTERN_H
#include "minilzo.h"
#include <winsock2.h>
/**



*/
//extern int g_SpeedMB;//声明全局变量 用于设置限速 在线程中只读不写
//extern char g_NowTime[32];
int getNowYearMonth(char * nowYearMonth);
//这里直接声明了一个方法 不是类 不需要实例化 方法可以直接使用
//2022-10-22 hzh 修改
int getNowTime(char * nowTime);
//20231120 添加无标点时间
int getNowTimeNoSpace(char * nowTime);
//2022-10-22 hzh 测试可用 但是不推荐
string getNowTime();
//目前暂不使用
bool checkRelaPath(string rootDir,string strFullName);//目前暂不使用
string getSavePath(string rootDir,string strFullName);//返回""表示创建失败
//目前暂不使用 存在new后未回收情况 不能用这个函数
//char* getRelaPath(string rootDir,string strFullName); //返回  /a/d 最后没有

//获取当前执行程序文件所在真实路径 而不是吊起路径 最后不包括斜杠 输入数组长度必须是512
int getProgramPath(char* realPath);

DWORD MyGetTick();
//这个可以随便调用 函数只有在一定延时后才调用updatespeed2
void UpdateSpeed( IUdxTcp * pSocket);
void UpdateSpeed2( IUdxTcp * pSocket);
IUdxTime * GetTimer();
/************************************************************************/
/* 文件传输速度相关                                                    */
/************************************************************************/
void UpdateFileTrans(UINT64 fileLength,UINT64 transdLength);
string ToString(UINT64 speed);

/************************************************************************/
/* 文件收发记录日志用的结构体                                           */
/************************************************************************/
struct sendFileRecord
{
	sendFileRecord(){memset(this,0,sizeof(sendFileRecord));};
	char sendTime[32];
	char fileName[256];
	UINT64 speed;
	UINT64 fsizeB;
	unsigned long ms;	
};
struct reciveFileRecord
{
	reciveFileRecord(){memset(this,0,sizeof(reciveFileRecord));};
	char reciveTime[32];
	char fileName[256];
	UINT64 speed;
	UINT64 fsizeB;
	unsigned long ms;	
};
/************************************************************************/
/* 控制消息结构体                                                       */
/************************************************************************/
struct ctlMsg
{
	ctlMsg(){memset(this,0,sizeof(ctlMsg));};
	char ctlCmd[3];
	int mode;//0或1 大文件还是小文件模式 这个参数已经弃用了 
};
/************************************************************************/
/*  该tcp正在传输的文件状态 UDXfile指针 文件长度 已传输长度   
     传输长度和文件长度相等时 表示传输完成 */
/************************************************************************/

struct tcpTransFileState {
	tcpTransFileState()
	{
		memset(this,0,sizeof(tcpTransFileState));
		
		pFile = CreateUdxFile();
		wrkmem= (lzo_voidp) malloc(LZO1X_1_MEM_COMPRESS);//压缩使用的空间 不管是否启用压缩 都先申请了
		in = (lzo_bytep) malloc(SENDPACKAGESIZE);//压缩输入空间 
	};
	~tcpTransFileState()
	{
		//结构体可以用析构和构造函数
		pFile->Destroy();
		if (pMyFile)
		{
			fclose(pMyFile);
		}
		
		free(wrkmem);
		free(in);
	};
	FILE* pMyFile;//接收文件时使用
	IUdxFile * pFile;//文件指针
	UINT64 fileLength;//文件长度
	UINT64 transedLength;//已传输长度
	char szFileTmp[256];//文件名
	char szFile[256];//文件名
	BYTE transState;//0 不能传输 1 可以开始了 2 结束了 3失败了
	lzo_voidp wrkmem;//压缩使用的空间 不管是否启用压缩 都先申请了 大文件模式才用（2023-11 小文件应该也用？）
	lzo_bytep in ;//压缩输入空间 大文件模式才用（2023-11 小文件应该也用？）
};


//执行cmd命令 并返回结果
int execmd(char * cmd,char * result);

//将制定目录下的文件放到list列表中 通过bdeep判断是否是要递归目录
bool MyListDir(char*szDir,list<string> &listfile,BOOL bdeep);

class myTool 
{
public:
	myTool(void);
	~myTool(void);
	
	void printStr(const char* format,...);
	void printStrandDB(const char* format,...);
	char m_NowTime[32];
	std::wstring Utf82Unicode(const std::string& utf8string);
	    //unicode 转为 ascii 
	std::string WideByte2Acsi(std::wstring& wstrcode);
	//utf-8 转 ascii 
	std::string UTF_82ASCII(std::string& strUtf8Code);
	//ascii 转 Unicode 
	std::wstring Acsi2WideByte(std::string& strascii);
	//Unicode 转 Utf8 
	std::string Unicode2Utf8(const std::wstring& widestring);
	//ascii 转 Utf8 
	std::string ASCII2UTF_8(std::string& strAsciiCode); 
protected:
private:
	SOCKET s;
	SOCKADDR_IN addIn;
};

//extern myTool getMyTool; //全局变量 大家都可以用这个工具
myTool* getMyTool();

typedef IUdxFifoList* UdxListPtr;
typedef IUdxTcp* UdxTcpPtr;
#endif